package entidades;
import tipos.NumeroVoo;
import tipos.Data;
import tipos.Horario;
/**
 * Classe que representa a entidade vôo.
 * @author Daniel Saad
 * @author Lucas de Melo
 * @author Thiago Stuckert
 **/
public class Voo {
    /**
    * Variável que armazena o número do vôo.
    */
    private String numeroVoo;
    /**
    * Variável que armazena a data de partida do vôo.
    */
    private String dataPartida;
    /**
    * Variável que armazena a data de chegada do vôo.
    */
    private String dataChegada;
    /**
    * Variável que armazena o horário de ida do vôo.
    */
    private String horarioPartida;
    /**
    * Variável que armazena o horário de volta do vôo.
    */
    private String horarioChegada;
    /**
    * Variável que armazena o código do aeroporto de origem do vôo.
    */
    private Aeroporto aeroportoPartida;
    /**
    * Variável que armazena o código do aeroporto de destino do vôo.
    */
    private Aeroporto aeroportoChegada;
    /**
     * Variável nome da cidade de origem para listagem de vôo.
     */
    private Cidade cidadeOrigem;
     /**
     * Variável nome da cidade de destino para listagem de vôo.
     */
    private Cidade cidadeDestino;
    /**
     * Quantidade de vagas disponíveis no voo.
     */
    private int vagas;

    /**
     * Construtor utilizado apenas nos testes do JUnit desenvolvidos para o
     * primeiro trabalho.
     * @param numeroVooParam Numero de voo a ser construido
     * @param dataPartidaParam Data de partida a ser construida
     * @param dataChegadaParam Data de chegada a ser construida
     * @param horarioPartidaParam Horario de partida a ser construida
     * @param horarioChegadaParam Horario de chegada a ser construido
     * @param aeroportoPartidaParam String a ser passada para o construtor
     * do objeto aeroporto
     * @param aeroportoChegadaParam String a ser passada para o construtor
     * do objeto aeroporto
     * @exception NullPointerException.
     * @exception IllegalArgumentException.
     */
    public Voo(final String numeroVooParam, final String dataPartidaParam,
            final String dataChegadaParam, final String horarioPartidaParam,
            final String horarioChegadaParam,
            final Aeroporto aeroportoPartidaParam,
            final Aeroporto aeroportoChegadaParam) {

            setNumeroVoo(numeroVooParam);
            setDataPartida(dataPartidaParam);
            setDataChegada(dataChegadaParam);
            setHorarioPartida(horarioPartidaParam);
            setHorarioChegada(horarioChegadaParam);

    }


    /**
     * Construtor da entidade voo.
     * @param numeroVooParam Cod voo.
     * @param dataPartidaParam data partida.
     * @param dataChegadaParam data chegada.
     * @param horarioPartidaParam horario partida.
     * @param horarioChegadaParam horario chegada.
     * @param vagasParam vagas disponiveis.
     */
    public Voo(final String numeroVooParam, final String dataPartidaParam,
            final String dataChegadaParam, final String horarioPartidaParam,
            final String horarioChegadaParam,
            final int vagasParam) {

            setNumeroVoo(numeroVooParam);
            setDataPartida(dataPartidaParam);
            setDataChegada(dataChegadaParam);
            setHorarioPartida(horarioPartidaParam);
            setHorarioChegada(horarioChegadaParam);
            setVagas(vagasParam);
    }


    /**
     * Construtor com todos os atributos do voo.
     * @param numeroVooParam Código do voo.
     * @param dataPartidaParam Data de partida do voo.
     * @param dataChegadaParam Data de chegada do voo.
     * @param horarioPartidaParam Horário de partida de voo.
     * @param horarioChegadaParam Horário de chegada de voo.
     * @param aeroportoPartidaParam Aeroporto de Partida do voo.
     * @param aeroportoChegadaParam Aeroporto de Chegada do voo.
     * @param cidadeOrigemParam Cidade de origem do voo.
     * @param cidadeDestinoParam Cidade de destino do voo.
     * @param vagasParam Quantidade de vagas do voo.
     */
    public Voo(final String numeroVooParam, final String dataPartidaParam,
            final String dataChegadaParam, final String horarioPartidaParam,
            final String horarioChegadaParam,
            final Aeroporto aeroportoPartidaParam,
            final Aeroporto aeroportoChegadaParam,
            final Cidade cidadeOrigemParam,
            final Cidade cidadeDestinoParam,
            final int vagasParam) {
            setNumeroVoo(numeroVooParam);
            setDataPartida(dataPartidaParam);
            setDataChegada(dataChegadaParam);
            setHorarioPartida(horarioPartidaParam);
            setHorarioChegada(horarioChegadaParam);
            setAeroportoPartida(aeroportoPartidaParam);
            setAeroportoChegada(aeroportoChegadaParam);
            setCidadeOrigem(cidadeOrigemParam);
            setCidadeDestino(cidadeDestinoParam);
            setVagas(vagasParam);
    }

    /**
     * Construtor utilizado na recuperacao de voos.
     * @param codigoVooParam novo numero de voo a ser setado.
     */
    public Voo(final String codigoVooParam) {
        setNumeroVoo(codigoVooParam);
    }

    /**
     * Construtor vazio.
     */
    public Voo() {
    }


    /**
     * Método recupera a quantidade de vagas disponíveis no voo.
     * @return Quantidade de vagas.
     */
    public final int getVagas() {
        return vagas;
    }
    /**
     * Método set a quantidade de vagas disponíveis no voo.
     * @param vagasParam novo valor para vagas.
     */
    public final void setVagas(final int vagasParam) {
        if (vagasParam < 0) {
            throw new IllegalArgumentException("A quantidades de vagas deve"
                    + " ser positiva.");
        } else {
            vagas = vagasParam;
        }
    }
    /**
     * Método setAeroporto.
     * @param aeroportoParam aeroporto de partida a setar.
     */
    public final void setAeroportoPartida(final Aeroporto aeroportoParam) {
        aeroportoPartida = aeroportoParam;
    }
   /**
    * Método setAeroporto.
    * @param aeroportoParam aeroporto de chegada a setar.
    */
    public final void setAeroportoChegada(final Aeroporto aeroportoParam) {
        aeroportoChegada = aeroportoParam;
    }
    /**
     * Método setCidade.
     * @param cidadeParam cidade de origem a setar.
     */
    public final void setCidadeOrigem(final Cidade cidadeParam) {
        cidadeOrigem = cidadeParam;
    }
    /**
     * Método setCidade.
     * @param cidadeParam cidade de destino a setar.
     */
    public final void setCidadeDestino(final Cidade cidadeParam) {
        cidadeDestino = cidadeParam;
    }

    /**
     * Método getAeroportoPartida.
     * @return aeroporto de partida.
     */
    public final Aeroporto getAeroportoPartida() {
        return aeroportoPartida;
    }

    /**
     * Método getAeroportoChegada.
     * @return aeroporto de chegada.
     */
    public final Aeroporto getAeroportoChegada() {
        return aeroportoChegada;
    }

    /**
     * Método getCidadeOrigem.
     * @return Cidade de origem.
     */
    public final Cidade getCidadeOrigem() {
        return cidadeOrigem;
    }

    /**
     * Método getCidadeDestino.
     * @return Cidade de Destino.
     */
    public final Cidade getCidadeDestino() {
        return cidadeDestino;
    }

    /**
     *
     * @return Data da chegada do voo.
     */
    public final String getDataChegada() {
        return dataChegada;
    }
    /**
     *
     * @param dataChegadaParam Data da chegada do voo.
     * @exception NullPointerException.
     * @exception IllegalArgumentException.
     */
    public final void setDataChegada(final String dataChegadaParam) {
        Data.validar(dataChegadaParam);
        this.dataChegada = dataChegadaParam;
    }
    /**
     *
     * @return Data da partida do voo.
     */
    public final String getDataPartida() {
        return dataPartida;
    }
    /**
     * Método setDataPartida.
     * @param dataPartidaParam Data da partida do voo.
     * @exception NullPointerException.
     * @exception IllegalArgumentException.
     */
    public final void setDataPartida(final String dataPartidaParam) {
        try {
            Data.validar(dataPartidaParam);
            this.dataPartida = dataPartidaParam;
        } catch (NullPointerException excecao) {
            throw excecao;
        } catch (IllegalArgumentException excecao) {
            throw excecao;
        }
    }
    /**
     *
     * @return Horario da chegada do voo.
     */
    public final String getHorarioChegada() {
        return horarioChegada;
    }
    /**
     *
     * @param horarioChegadaParam Horario da chegada do voo.
     * @exception NullPointerException.
     * @exception IllegalArgumentException.
     */
    public final void setHorarioChegada(final String horarioChegadaParam) {
        try {
            Horario.validar(horarioChegadaParam);
            this.horarioChegada = horarioChegadaParam;
        } catch (NullPointerException excecao) {
            throw excecao;
        } catch (IllegalArgumentException excecao) {
            throw excecao;
        }
    }
    /**
     *
     * @return Horario da partida do voo.
     */
    public final String getHorarioPartida() {
        return horarioPartida;
    }
    /**
     *
     * @param horarioPartidaParam Horario da partida do voo.
     * @exception NullPointerException.
     * @exception IllegalArgumentException.
     */
    public final void setHorarioPartida(final String horarioPartidaParam) {
        try {
            Horario.validar(horarioPartidaParam);
            this.horarioPartida = horarioPartidaParam;
        } catch (NullPointerException excecao) {
            throw excecao;
        } catch (IllegalArgumentException excecao) {
            throw excecao;
        }
    }
    /**
     *
     * @return Numero do voo.
     */
    public final String getNumeroVoo() {
        return numeroVoo;
    }
    /**
     *
     * @param numeroVooParam Numero do voo.
     * @exception NullPointerException.
     * @exception IllegalArgumentException.
     */
    public final void setNumeroVoo(final String numeroVooParam) {

        try {
            NumeroVoo.validar(numeroVooParam);
            this.numeroVoo = numeroVooParam;
        } catch (NullPointerException excecao) {
            throw excecao;
        } catch (IllegalArgumentException excecao) {
            throw excecao;
        }
    }

    /**
     * Diminui o numero de vagas em um jogo.
     */
    public final void adicionaPassageiro() {
        vagas--;
    }

    /**
     * Aumenta o numero de vagas em um voo.
     */
    public final void retiraPassageiro() {
        vagas++;
    }

}
